package it.unipd.dei.bd.icineasti.database;

import it.unipd.dei.bd.icineasti.resource.Proiettore;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * Ritorna i proiettori che avranno bisogno di manutenzione entro dieci ore.
 * 
 * @author Bardelle Renzo
 * @version 1.00
 */
public class GetProiettoriDaManutendereDatabase {

	private static final String STATEMENT = "SELECT * " +
											"FROM ( " +
											"SELECT P.idprj, P.seriale, P.marca, P.modello, P.intervmanutenz, P.datalampadina, P.in3d, P.idsala , SUM(R.Durata) AS totale " +
											"FROM proiettore AS P " +
											"INNER JOIN r_proiettato AS R ON P.idprj = R.idprj " +
											"INNER JOIN spettacolo AS S ON s.codice = R.codicespettacolo " +
											"INNER JOIN palinsesto ON palinsesto.codice = s.codicepalinsesto " +
											"WHERE palinsesto.dataora >= p.datalampadina AND palinsesto.dataora <= current_timestamp " +
											"GROUP BY P.idprj, P.seriale, P.marca, P.modello, P.intervmanutenz, P.datalampadina, P.in3d, P.idsala) as minuti " +
											"WHERE totale >= ( intervmanutenz-600 )";

	private final Connection con;
	
	private final List<Proiettore> proiettori;
	
	public GetProiettoriDaManutendereDatabase(Connection con) {
		this.con = con;
		this.proiettori = new ArrayList<Proiettore>();
	}

	public List<Proiettore> getProiettori() throws SQLException {

		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			pstmt = con.prepareStatement(STATEMENT);

			rs = pstmt.executeQuery();
			
			while (rs.next())
				proiettori.add(
							new Proiettore(
										rs.getInt("idprj"),
										rs.getInt("seriale"),
										rs.getString("marca"), 
										rs.getString("modello"),
										rs.getInt("intervmanutenz"),
										rs.getTimestamp("datalampadina"),
										rs.getBoolean("in3d"),
										rs.getInt("idsala")
									)
						);
			
		} finally {
			
			if (pstmt != null)
				pstmt.close();
			
			if (rs != null)
				rs.close();
			
			con.close();
		}
		
		return proiettori;
	}
}
